const { ValidationError } = require("../utils/errors");
const validate = require("validate.js");
const { addNlogTypeDao, finAllBlogTypeDao, findOneBlogTypeDao, deleteBlogTypeDao, updateBlogTypeDao } = require("../dao/blogTypeDao");
const { formatResponse, handleDataPattern } = require("../utils/tool");
const { updataBannerDao } = require("../dao/bannerDao");
const { blogCountByBlogType } = require("../dao/blogDao");

// 新增博客分类
module.exports.addBlogTypeService = async function (blogTypeInfo) {
  // 数据验证规则
  const blogTypeRules = {
    name: {
      presence: {
        allowEmpty: false
      },
      type: "string"
    },
    order: {
      presence: {
        allowEmpty: false
      },
      type: "string"
    }
  }
  // 进行数据验证
  const validateResult = validate.validate(blogTypeInfo,blogTypeRules);
  if(!validateResult) {
    // 验证通过
    blogTypeInfo.articleCount = 0; // 新增一个分类，文章数量为0
    const data = await addNlogTypeDao(blogTypeInfo);
    return formatResponse(0, '', data);
  } else {
    // 验证失败
    throw new ValidationError("数据验证失败");
  }
}

// 查询所有博客分类
module.exports.findAllBlogTypeService = async function () {
  let data = handleDataPattern(await finAllBlogTypeDao());
  data = data.sort((a, b) => a.order - b.order);
  return formatResponse(0, "", data);
}

// 查询指定一个博客分类
module.exports.findOneBlogTypeService = async function (id) {
  const data = await findOneBlogTypeDao(id);
  return formatResponse(0, '', data);
}

// 修改指定一个博客分类
module.exports.updateBlogTypeService = async function (id, newBlogTypeInfo) {
  const data = await updateBlogTypeDao(id, newBlogTypeInfo);
  return formatResponse(0, '', data);
}

// 删除指定一个博客分类
module.exports.deleteBlogTypeService = async function (id) {
  const count = await blogCountByBlogType(id);
  deleteBlogTypeDao(id);
  // 这里需要返回受影响的文章数目
  return formatResponse(0, '', count);
}